﻿#pragma once

#include <QObject>
#include "robothandcommunication_global.h"
#include "common_data.h"
#include "../component/robot/robot_data.h"
struct RobotParam {
	QString id;
	QString ip;
	int statusPort;
	int cmdPort;
	Position base;
};



class ROBOTHAND_EXPORT RobotHandCommunication : public QObject
{
	Q_OBJECT

public:
	RobotHandCommunication(QObject* parent);
	~RobotHandCommunication();

	static RobotHandCommunication* GetInstanceByBrand(const QString& brand);
	/****************************************************************************
	 * 功能: 初始化函数
	 * 传参: 初始化参数
	 * 返回值: 初始化并连接成功返回0, 参数错误返回 -1， 其它返回-2
	 ****************************************************************************/
	virtual int Init(const RobotParam& param) = 0;

	/****************************************************************************
	 * 功能: 重连接口
	 * 传参:
	 * 返回值: 重连是否成功返回0， 状态端口失败返回-1，命令端口失败返回-2, 全部失败返回-3
	 ****************************************************************************/
	virtual int Reconnecte() = 0;
	virtual int GetConnectedState() = 0;
	/****************************************************************************
	 * 功能: 停止接口，机械手停止运动并清理运动轨迹
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool Stop() = 0;

	/****************************************************************************
	 * 功能: 暂停/恢复接口，机械手暂停，不清理轨迹，机械手恢复后继续运动
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool Pause() = 0;
	virtual bool Resume() = 0;

	/****************************************************************************
	 * 功能: 设置和获取当前的TCPBase(未启用)
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool SetTcpBase(const QString& info) = 0;
	virtual QString GetTcpBase() = 0;

	/****************************************************************************
	 * 功能: 设置DO
	 * 传参: index: DO编号(1-n), value: true=1,false=0;
	 * 返回值:
	 ****************************************************************************/
	virtual bool SetDo(unsigned int index, bool value) = 0;

	/****************************************************************************
	 * 功能: 夹具动作/预定义动作
	 * 传参: index: 预先定义的动作编号（由机械手内部程序定义）
	 * 返回值:
	 ****************************************************************************/
	virtual bool SetGrip(unsigned int index) = 0;

	/****************************************************************************
	 * 功能: 移动指令
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool MoveJL(const QList<MoveJLInfo>& moves) = 0;

	/****************************************************************************
	 * 功能: 特殊指令
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool ExecCmd(const QString& cmd, const QString& para, QString& result) = 0;

signals:
	// 连接状态更改信号, 0:连接 -1：状态断开断开 -2：连接端口端口 -3：同时断开
	void ConnectionStateChanged(int state);
	// 执行点位ID信号
	void RobotHandPointId(int id);
	// TCP坐标信号
	void RobotHandJoints(const QString& joints);
	// 关节角度值信号
	void RobotHandTargets(const QString& targets);
	// 运动状态信息 0: 静止 1：运动
	void RobotHandMoving(int flag);
	// 夹具编号
	void RobotHandToolID(int id);
	// 错误码信号
	void RobotHandFaultCode(int code, const QString& err);
	// DI信息
	void RobotHandDIInfo(const QString& diInfo);
	// DO信息
	void RobotHandDOInfo(const QString& doInfo);

protected:
	RobotParam m_info = {};
	QString m_brand = "";	// 款型
};
